/*
背景
你玩儿过扫雷游戏吧？有个操作系统中带了这个小游戏，那个系统叫什么来着？; -)在游戏中要想过关，就必须要在一个 NxM 的区域上找出所有的地雷。游戏过程中，计算机会在地图上显示一些数字从而帮助你确定哪里有地雷。例如，在下面这个有两颗地雷的 4x4 的地图（*表示地雷）：

*...
....
.*..
....
根据上面的地图，可以计算出应该提供给游戏者的数字如下所示：

* 100
2210
1 * 10
1110
每个数字表示了该方格周围到底有几个地雷，当然，一个方格周围最多的时候只会有八个。

输入
输入中将包括一系列的地图，每个地图的第一行有两个整数 n 和 m（0 < n, m <= 100），它们表示了地图的行数和列数。下面的 n 行每行都有 m 个字符，其中 "." 表示安全而 "*" 表示地雷。如果地图的 n 和 m 都为 0，则表示输入结束。

	输出
	针对每一个地图，首先输出一行：

	Field #x:
其中 x 是当前地图的编号（从 1 开始）。下面的 n 行则将地图中的 "." 以数字表示，该数字表示该方格周围有多少颗地雷。

来源
http ://acm.uva.es/problemset/v101/10189.html

*/

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
#if defined(_WIN32) && !defined(__cplusplus)
#define inline __inline
#endif

#include <stdio.h>

#define BOOL	int 
#define TRUE	1
#define FALSE	0

static inline int GetLandmineNum(char area[102][102], int centerX, int centerY)
{
	int num = 0;
	for (int i = centerX - 1; i < centerX + 2; i++)
	{
		for (int j = centerY - 1; j < centerY + 2; j++)
		{
			if (area[i][j] == '*')
			{
				num++;
			}
		}
	}
	return num;
}

static inline void PrintField(char area[102][102], int rowNum, int columnNum)
{

	for (int i = 1; i < rowNum + 1; i++)
	{
		for (int j = 1; j < columnNum + 1; j++)
		{
			if (area[i][j] == '*')
			{
				printf("*");
			}
			else
			{
				printf("%d", GetLandmineNum(area, i, j));
			}
		}
		printf("\n");
	}
}

int main()
{
	int n, m;	
	int areaNum = 1;
	
	while (TRUE)
	{
		scanf("%d%d", &n, &m);
		if (n == 0 || m == 0)
		{
			return 0;
		}		
		if (areaNum > 1)
		{
			printf("\n");
		}
		
		char area[102][102] = {{0}};
		for (int i = 1; i < n + 1; i++)
		{
			scanf("%s", &area[i][1]);
		}
		printf("Field #%d:\n", areaNum++);
		PrintField(area, n, m);
	}
}